package com.carrey.carrey_utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @Title: 流处理类
 * @Description 
 * @author Carre
 * @date 2020-12-16
 * @param StreamUtils.java
 * @return 返回类型 :
 * @throws
 */
public class StreamUtils {

	
	/**
	 * 	批量关闭流
	 * @param closeables
	 * @throws Exception
	 */
	public static void closings(AutoCloseable...  closeables) throws Exception {
        // 非空判断
        if (closeables != null) {
             // 循环关闭
             for (AutoCloseable auto : closeables) {
                 // 非空判断
                 if (auto != null) {
                	 // 关流
                     auto.close();
                 }
             }
        }
    }
	
	/**
	 * 	自定义流是否关闭
	 * @param inputStream
	 * @param outputStream
	 * @param closeInputStream
	 * @param closeOutputStream
	 * @throws Exception
	 */
    public static void copy(InputStream inputStream,  OutputStream outputStream, boolean closeInputStream, boolean closeOutputStream) throws  Exception {
         // 用于复制的字节数组
         byte[] b = new byte[1024];
         int len = 0;
         // 复制，如果讀取到的數據 >0 ,證明讀取到了數據
         while ((len = inputStream.read(b)) > 0) {
              // 将数据写入输出流
              outputStream.write(b, 0, len);
         }
         // 关闭流
         if (closeInputStream) {
              closings(inputStream);
         }
         if (closeOutputStream) {
              closings(outputStream);
         }
     }
    
    /**
     * 	默认不关闭
     * @param inputStream
     * @param outputStream
     * @throws Exception
     */
    public static void copy(InputStream inputStream,  OutputStream outputStream) throws Exception {
         copy(inputStream, outputStream, false, false);
     }
    
    // 读取文本流
    /**
     * 	自定义编码格式和是否关闭流
     * @param inputStream
     * @param encode
     * @param isClose
     * @return
     * @throws Exception
     */
    public static String asString(InputStream inputStream,  String encode, boolean isClose) throws Exception {
         // 存放结果
         StringBuffer sb = new StringBuffer();
         // 用于复制的字节数组
         byte[] b = new byte[1024];
         int len = 0;
         // 复制，如果读取的个数 > 0，证明读取到了数据
         while ((len = inputStream.read(b)) > 0) {
              // 将数据写入StringBuffer
              sb.append(new String(b, 0, len, encode));
         }
         // 关流
         if (isClose) {
              closings(inputStream);
         }
         return sb.toString();
     }
    
    // 自定义是否关闭流（默认编码格式）
    public static String asString(InputStream inputStream,  boolean isClose) throws Exception {
         return asString(inputStream, "UTF-8", true);
     }
    
    // 默认编码格式并且关闭流
    public static String asString(InputStream inputStream)  throws Exception {
         return asString(inputStream, true);
     }
    
    /**
     * 	读取文本文件，默认编码格式
     * @param textFile
     * @return
     * @throws Exception
     */
    public static String asString(File textFile) throws  Exception {
         return asString(new FileInputStream(textFile));
     }
    
    //  默认编码格式，自定义流处理
    public static String asString(File textFile, boolean  isClose) throws Exception {
        return asString(new FileInputStream(textFile),  isClose);
    }
    
    // 指定编码格式，自定义流处理
    public static String asString(File textFile, String  encode, boolean isClose) throws Exception {
         return asString(new FileInputStream(textFile),  encode, isClose);
     }
    
    // 按行读取文本文件（返回List集合）
    /**
     * 	自定义编码格式
     * @param textFile
     * @param encode
     * @return
     * @throws Exception
     */
    public static List<String> readingLineFormTextFile(File  textFile, String encode) throws Exception {
         // 存放结果
         List<String> list = new ArrayList<String>();
         // 字符输入流
         FileReader fr = new FileReader(textFile);
         // 缓冲字符输入流
         BufferedReader br = new BufferedReader(fr);
         // 用于存入复制的数据
         String str = null;
         // 复制，如果读取的不为空，证明读取到了数据
         while ((str = br.readLine()) != null) {
              list.add(str);
         }
         // 关流
         closings(br);
         closings(fr);
         return list;
     }
    // 默认UTF-8格式
    public static List<String> readingLineFormTextFile(File  textFile) throws Exception {
         return readingLineFormTextFile(textFile,  "UTF-8");
     }
	
	
}
